#include <iostream>
#include <stdlib.h>

using namespace std;

struct Node
{
    int data;
    struct Node* next;
};

struct Queue
{
    Node* front;
    Node* rear;
};

Node* init_node()
{
    Node* n=(Node*) new Node;
    if(n==NULL)
    {
        cout<<"the node create failed"<<endl;
        exit(0);
    }
    return n;
}

Queue* init_queue()
{
    Queue* q=(Queue*)new Queue;
    if(q==NULL)
    {
        cout<<"the queue craete failed"<<endl;
        exit(0);
    }
    q->front=NULL;
    q->rear=NULL;
    return q;
}

int empty(Queue* q)
{
    if(q->front==NULL) return 1;
    else return 0;
}

void push_queue(Queue* q,int data)
{
    Node* n=init_node();
    n->data=data;
    n->next=NULL;

    if(empty(q))
    {
        q->front=n;
        q->rear=n;
    }
    else
    {
        q->rear->next=n;
        q->rear=n;
    }
}

void pop(Queue* q)
{
    Node* n=q->front;
    if(empty(q))
    {
        return ;
    }
    if(q->front==q->rear)
    {
        q->front=NULL;
        q->rear=NULL;
        free(n);        // FIXME: 如果是new出来的，最好用 `delete n;`
    }
    else
    {
        q->front=q->front->next;
        free(n);
    }
}

void display_queue(Queue* q)
{
    Node* n=init_node();
    n=q->front;
    if(empty(q))
    {
        return ;
    }
    while(n!=NULL)
    {
        cout<<n->data;
        n=n->next;
    }
    cout<<endl;
}

int main()
{
    Queue* q=init_queue();
    cout<<"enter the queue"<<endl;
    for(int i=0;i<5;i++)
    {
        push_queue(q,i);
        display_queue(q);
    }

    cout<<"exit the queue"<<endl;
    for(int i=0;i<5;i++)
    {
        pop(q);
        display_queue(q);
    }
   
    system("pause");
    return 0;
}
        

